﻿/*
142857 
Time Limit:1000MS  Memory Limit:32768K


Description:
这是一个神奇的数串，它发现于埃及金字塔内，它是一组神奇数字，
它证明一星期有7天， 它自我累加一次，就由它的6个数字，依顺序轮值一次，
即： 142857×1=142857 142857×2=285714 142857×3=428571
142857×4=571428 142857×5=714285 142857×6=857142
现在，在X星球的金字塔内也发现了类似的数字串，这类数字的特征都是有n位长度，
当乘以从1到n的数字时，数字串只是数字的位置发生变化，而其他都没变化。
那么就要你编个程序判断这个数字是不是这样的循环数字串。 

Input:
输入数据是一系列的从2位到60位长度的数串。
(注意：数串的前置0不能被移去的，它们被认为数字串的一部分。也就是01是个两位的数串，而1是一位的数串) 
Output:
对于每个数串，若其数字是循环的数字，输出Yes 否则输出No 
Sample Input:
142857
142856
142858
01
0588235294117647
Sample Output:
Yes
No
No
No
Yes
*/
/*
观察142857，我们用1至6的数来乘: 
1′ 142857=142857

2′ 142857=285714

3′ 142857=428571

4′ 142857=571428

5′ 142857=714285

6′ 142857=857142

所得得结果是1、4、2、8、5、7六个数字依原来的次序循环排列只是开头的数字变动而已。
这种数我们叫做循环数，其实这个数142857是由1/7所形成循环小数的循环节(1/7=0.142857142857142857…)。
而所有循环数也都由某质数的倒数所形成之循环小数的循环节而得来的。
下一个循环数是由质数17所形成的，1/17=0.0588235294117647…，
而0588235294117647即为一循环数(2? 0588235294117647=1176470588235294)。

会产生如此循环数的质数依序为7、17、19、23、29、47、59、61、97(<100)。

142857还有一个很有趣的性质。当142857乘以7时其乘积为一连串的9(142857′ 7=999999)，
而0588235294117647乘以17也是一连串的9。
还有142857分成两半相加也是一连串的9(注：142+857=999)，
而0588235294117647分成两半相加: 05882352+ 94117647=99999999，这真是非常奇妙的巧合。
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
	const unsigned ARRAY_SIZE = 60;
	char cycle[ARRAY_SIZE + 1];
	while (gets(cycle))
	{
		char bicycle[ARRAY_SIZE + ARRAY_SIZE + 1];
		strcpy(bicycle, cycle);
		strcat(bicycle, cycle);	

	//	puts(bicycle);

		bool is_magical=true;

		char new_cycle[ARRAY_SIZE + 1];	
		strcpy(new_cycle, cycle);

		size_t len = strlen(cycle);
		for (size_t k=2; k<=len; ++k)
		{				
			for (int i = len - 1, carry = 0; i >= 0; --i)
			{
				new_cycle[i] = new_cycle[i] - '0' + cycle[i] - '0' + carry;
				carry = (new_cycle[i]) / 10;
				new_cycle[i] = new_cycle[i] % 10 + '0';
			}
			new_cycle[len]='\0';
			//puts(new_cycle);
			if(NULL==strstr(bicycle, new_cycle))
			{
				is_magical=false;
				break;
			}
		}

		if (is_magical)
			puts("Yes");
		else
			puts("No");
	}	
	return EXIT_SUCCESS;
}
/*
int main()
{
	const unsigned ARRAY_SIZE=60;
	char cycle[ARRAY_SIZE+1];
	while (gets(cycle))
	{
		bool is_magical=true;
		size_t len=strlen(cycle);

		{
			int carry=0;
			for (size_t i=0, j=(len+1)/2; j<len; ++i, ++j)
				if(9!=(cycle[i]-'0'+cycle[j]-'0'))
				{
					is_magical=false;
					break;
				}
		}
////////////////////////////////////////////////////////////////
		{
			int carry=0;
			for (int i=len-1;i>=0; --i)
			{
				int product = (cycle[i]-'0')*(len+1) + carry;
				carry=product/10;
				product%=10;
				if(product-9)
				{
					is_magical=false;
					break;					
				}
			}			
		}

		if(is_magical)
			puts("Yes");
		else
			puts("No");
	}
	return EXIT_SUCCESS;
}
*/